#ifndef NETLIB_ACCEPTOR_H
#define NETLIB_ACCEPTOR_H

// 创建套接字并绑定、监听、接受连接

#include <functional>

#include "Channel.h"
#include "Socket.h"

namespace netlib
{

namespace net
{

class EventLoop;
class InetAddress;

class Acceptor : noncopyable // 创建套接字并绑定、监听、接受连接，不可拷贝
{
public:
    typedef std::function<void (int sockfd, const InetAddress&)> NewConnectionCallback;

    Acceptor(EventLoop* loop, const InetAddress& listenAddr, bool reuseport);

    ~Acceptor();

    // 设置新连接建立的回调函数
    void setNewConnectionCallback(const NewConnectionCallback& cb)
    { newConnectionCallback_ = cb; }

    void listen(); // 套接字开启监听

    bool listening() const { return listening_; } // 返回监听状态

private:
    void handleRead(); // 有新连接到来的处理函数，调用accept

    EventLoop* loop_;                               // acceptChannel_对象所属的EventLoop对象
    Socket acceptSocket_;                           // 监听套接字描述符
    Channel acceptChannel_;                         // 监听通道
    NewConnectionCallback newConnectionCallback_;   // 接受新连接的回调函数，没有设置则关闭连接
    bool listening_;                                // 是否处于监听状态
    int idleFd_;                                    // 空闲描述符，描述符用尽时去除可读事件

}; // class Acceptor end

} // namespace net end

} // namespace netlib end

#endif